package br.com.bean;

import java.util.ArrayList;
import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.ViewAccessScoped;
import org.primefaces.event.TabChangeEvent;

import br.com.domain.Menu;
import br.com.domain.MenuItem;
import br.com.domain.Perfil;
import br.com.domain.PerfilMenu;
import br.com.domain.Usuario;
import br.com.util.PropertiesUtil;
import br.com.util.SystemUtil;

@Named
@SessionScoped
public class MenuBean extends GenericBean {
	
	private static final long serialVersionUID = 1L;
	
	/**************************************************************************/
	/**                             ATRIBUTOS                                **/
	/**************************************************************************/
	
	/** BEAN INJETADO **/
	@Inject
	private SessionBean sessionBean;
	
	/** MENU DO SISTEMA **/
	private List<Menu> listMenu;
	
	/** MENU DO USUARIO LOGADO **/
	private List<Menu> listMenuUsuario;
	
	/** MENU DO USUARIO LOGADO **/
	private List<Menu> listMenuPerfil;
	
	/** ID DO MENU PRINCIPAL ATIVO **/
	private int activeTabIndex = -1;
	
	/**  MENU ITEM ATIVO **/
	private MenuItem menuItemClickado;
	

	/**************************************************************************/
	/**                             CONSTRUTOR                               **/
	/**************************************************************************/
	
	
	public MenuBean() {
		super();
		
		/** CRIANDO O MENU PADRAO - USUARIO **/		
		listMenuUsuario    = new ArrayList<Menu>();	
		
		/** CRIANDO O MENU PADRAO **/		
		listMenu           = new ArrayList<Menu>();	
		Menu menu;  
		
		/** *****************************************************************/
		/** MENU CADASTRO                                                  **/
		/********************************************************************/
		menu = getMenu(2, this.getNomeMenu("menu-id-2"), "imgCadastro.png");	
		menu.getListMenuItem().add(getMenuItem(21, this.getNomeMenu("menu-id-2-submenu-id-21"), "pagePessoaList", true));
		menu.getListMenuItem().add(getMenuItem(24, this.getNomeMenu("menu-id-2-submenu-id-22"), "pageLuisList", true));
		listMenu.add(menu);
		
		/** *****************************************************************/
		/** MENU SEGURANCA                                                 **/
		/********************************************************************/
		menu = getMenu(1, this.getNomeMenu("menu-id-1"), "imgSeguranca.png");		
		menu.getListMenuItem().add(getMenuItem(11, this.getNomeMenu("menu-id-1-submenu-id-11"), "pageUsuarioList", true ));
		menu.getListMenuItem().add(getMenuItem(12, this.getNomeMenu("menu-id-1-submenu-id-12"), "pagePerfilList", true ));
		listMenu.add(menu);
		
	}
	
	
	/**************************************************************************/
	/**                                M�TODOS                               **/
	/**************************************************************************/
	
	
	/** RETORNA UM MENU **/
	private Menu getMenu(Integer id, String nome, String icon) {
		Menu menu          = new Menu();	
		menu.setId(id);
		menu.setNome(nome);
		menu.setIcon(icon);
		return menu;
	}
	
	/** RETORNA UM MENU-ITEM **/
	private MenuItem  getMenuItem(Integer id, String nome, String page,  Boolean isTransacional) {
		MenuItem menuItem          = new MenuItem();	
		menuItem.setId(id);
		menuItem.setNome(nome);
		menuItem.setTransacional(isTransacional);
		menuItem.setPage(page);
		return menuItem;
	}
	
	/** IR PARA O MENU CLICKADO **/
	public void  gotoMenuItem(MenuItem menuItem) {
		
	   /**ATUALIZANDO MENU CLICKADO **/
	   this.menuItemClickado = menuItem;
	
	   /** INDO PARA O MENU **/	
	   goPage(menuItem.getPage());
	}
	
	
	/** CRIANO MENU BASEADO NO USUARIO **/
	public List<Menu> getMenuPorUsuario(Usuario usuario) {   
	   return  getMenuPrincipalPorPerfil(usuario.getPerfil());
	}
	
	/** CRIA O MENU PRINCIPAL BASEADO NO PERFIL **/
	private List<Menu> getMenuPrincipalPorPerfil(Perfil perfil) {
		
		  /** NOVO PERFIL PASSADO **/   
		  if ( !SystemUtil.possuiDados(perfil.getId())) {
			  return listMenu;
		   }
		
		   List<Menu> retorno = new ArrayList<Menu>();
		  
		   Perfil perfilUsuario = perfil;
		   List<PerfilMenu> listPerfilMenu  = perfilUsuario.getListPerfilMenu();
		   
		   /** VARRENDO MENUS **/
		   for (Menu menu: listMenu) {
			   
			   Menu menuUsuario = new Menu();
			   menuUsuario.setId(menu.getId());	 
			   menuUsuario.setNome(menu.getNome());
			   menuUsuario.setIcon(menu.getIcon());
			   	
			   /** VARRENDO ITENS DO MENU **/
			   for (MenuItem menuItem: menu.getListMenuItem()) { 	   
				  
				   /** VARRENDO ITENS DO MENU - DO PERFIL DO USUARIO **/
				   for (PerfilMenu perfilMenu: listPerfilMenu) {
					   
					   /** SE "ID MENU ITEM" IGUAL "ID MENU ITEM DO PERFIL" - ADICIONA NO LIST **/
					   if (perfilMenu.getIdMenuItem().equals(menuItem.getId()))	{
						   
						   /** CRIANDO MENU ITEM USUARIO **/
						   MenuItem menuItemUsuario = new MenuItem();
						   menuItemUsuario.setId(perfilMenu.getIdMenuItem());
						   menuItemUsuario.setAlterar(perfilMenu.getAlterar());
						   menuItemUsuario.setExcluir(perfilMenu.getExcluir());
						   menuItemUsuario.setIncluir(perfilMenu.getIncluir());
						   menuItemUsuario.setVisivel(perfilMenu.getVisivel());
						   menuItemUsuario.setNome(menuItem.getNome());
						   menuItemUsuario.setPage(menuItem.getPage());
						   
						   /** REGRA PARA CARREGAMENTO DO MENU PRICIPAL **/
						   if (perfilMenu.getVisivel()) {
							   menuUsuario.getListMenuItem().add(menuItemUsuario);
						   }
					   }
				   }
			   }
			   
			   /** VERIFICANDO SE TODOS OS ITEMS DE MENU ESTAO INVISIVEL **/
			   Boolean isTodosInvisiveis = true;
			   for (MenuItem menuItemVisivel: menuUsuario.getListMenuItem()) {
				   if (menuItemVisivel.getVisivel()){
					   isTodosInvisiveis = false;
					   break;
				   }
			   }
			   
			   /** ADICONADO MENU DO USUARIO - 
			    *  SE NAO ESTAO TODOS ITENS DE MENU INVISIVEIS**/
			   if (!isTodosInvisiveis) {
				   retorno.add(menuUsuario);
			   }
		   }
		   
		   return retorno;		
	}
	
	
	/** CRIA UM MENU COMPLETO BASEADO NO PERFIL **/
	public List<Menu> getMenuPorPerfil(Perfil perfil) {
		
		   /** NOVO PERFIL **/   
		   if ( !SystemUtil.possuiDados(perfil.getId())    || 
				!SystemUtil.possuiDados(perfil.getListPerfilMenu())) {
			   
			   /** ASSOCIANDO VARIAVEL USADA NA EDICAO DE PERFIS **/
			   listMenuPerfil = new ArrayList<Menu>(); 
			   listMenuPerfil = listMenu;
			   
			   for (Menu m : listMenuPerfil) {
				   
				  for (MenuItem mi : m.getListMenuItem()) {
					  
					  mi.setAlterar(false);
					  mi.setExcluir(false);
					  mi.setIncluir(false);
					  mi.setVisivel(false);
					
				}
				
			}
			   
			    return listMenuPerfil ;
		   }
		   
		   /** EDITANDO PERFIL **/		   
		   List<Menu> listMenuRetorno = new ArrayList<Menu>();
		  
		   Perfil perfilUsuario = perfil;
		   List<PerfilMenu> listPerfilMenu  = perfilUsuario.getListPerfilMenu();
		   
		   /** VARRENDO MENUS **/
		   for (Menu menu: listMenu) {
			   
			   Menu menuRetorno = new Menu();
			   menuRetorno.setId(menu.getId());
			   menuRetorno.setNome(menu.getNome());
			   
			   /** VARRENDO ITENS DO MENU **/
			   for (MenuItem menuItem: menu.getListMenuItem()) { 
				   
				  
				   /** CRIANDO UMA COPIA DO MENU ITEM PADRAO **/
				   MenuItem menuItemRetorno = new MenuItem(); 				   
				   menuItemRetorno.setAlterar(menuItem.getAlterar());
				   menuItemRetorno.setExcluir(menuItem.getExcluir());
				   menuItemRetorno.setId(menuItem.getId());
				   menuItemRetorno.setIncluir(menuItem.getIncluir());
				   menuItemRetorno.setNome(menuItem.getNome());
				   menuItemRetorno.setPage(menuItem.getPage());
				   menuItemRetorno.setTransacional(menuItem.getTransacional());
				   menuItemRetorno.setVisivel(menuItem.getVisivel());
				   menuItemRetorno.setVisivelNaoTransacional(menuItem.getVisivelNaoTransacional());
				   /*******************************************/
				   
				  
				   /** VARRENDO ITENS DO MENU - DO PERFIL DO USUARIO **/
				   for (PerfilMenu perfilMenu: listPerfilMenu) {
					   
					   /** SE "ID MENU ITEM" IGUAL "ID MENU ITEM DO PERFIL" - ADICIONA NO LIST **/
					   if (perfilMenu.getIdMenuItem().equals(menuItem.getId()))	{
						   
						   /** CRIANDO MENU ITEM USUARIO **/						  
						   menuItemRetorno.setAlterar(perfilMenu.getAlterar());
						   menuItemRetorno.setExcluir(perfilMenu.getExcluir());
						   menuItemRetorno.setIncluir(perfilMenu.getIncluir());
						   menuItemRetorno.setVisivel(perfilMenu.getVisivel());						   
						   
						   /** PARA MENU NAO TRANSACIONAIS **/
						   if (!menuItemRetorno.getTransacional()) {
							   menuItemRetorno.setVisivelNaoTransacional(perfilMenu.getVisivel());
						   }
						   
						   break;
					   }
				   }
				   
				   menuRetorno.getListMenuItem().add(menuItemRetorno);
			   }
			   
			   listMenuRetorno.add(menuRetorno);
		   }
		   
		   /** ASSOCIANDO VARIAVEL USADA NA EDICAO DE PERFIS **/
		   listMenuPerfil = listMenuRetorno;
		   
		   return listMenuRetorno;		
	}
	
	/** GRAVANDO INDEX NA MUNDAN�A DE TAB NO MENU **/	
	public void onTabChange(final TabChangeEvent event) {
		String activeTab = event.getTab().getId();
        int activeTabIn = 0;

        for (UIComponent comp : event.getTab().getParent().getChildren()) {
          if (comp.getId().equals(activeTab)) {
            break;
          }
          activeTabIn++;
        }
        this.activeTabIndex = activeTabIn;
    }
	
	public String getNomeMenu(String chave) {
		return PropertiesUtil.getMessageChave(chave);
	}
	
	/**************************************************************************/
	/**                              GET's E SET's                           **/
	/**************************************************************************/
	
	public List<Menu> getListMenuUsuario() {
		
		/** CRIAR MENU POR USUARIO **/
		if (!SystemUtil.possuiDados(listMenuUsuario)) {
			if (sessionBean.getUsuarioLogado() != null) {
				listMenuUsuario = getMenuPorUsuario(sessionBean.getUsuarioLogado());
			}
		}
		return listMenuUsuario;
	}

	public void setListMenuUsuario(List<Menu> listMenuUsuario) {
		this.listMenuUsuario = listMenuUsuario;
	}
	
	public List<Menu> getListMenu() {
		return listMenu;
	}

	public void setListMenu(List<Menu> listMenu) {
		this.listMenu = listMenu;
	}
	
	public int getActiveTabIndex() {
		return activeTabIndex;
	}

	public void setActiveTabIndex(int activeTabIndex) {
		this.activeTabIndex = activeTabIndex;
	}

	public List<Menu> getListMenuPerfil() {
 		return listMenuPerfil;
	}

	public void setListMenuPerfil(List<Menu> listMenuPerfil) {
		this.listMenuPerfil = listMenuPerfil;
	}

	public SessionBean getSessionBean() {
		return sessionBean;
	}

	public void setSessionBean(SessionBean sessionBean) {
		this.sessionBean = sessionBean;
	}


	public MenuItem getMenuItemClickado() {
		return menuItemClickado;
	}


	public void setMenuItemClickado(MenuItem menuItemClickado) {
		this.menuItemClickado = menuItemClickado;
	}
	
	


}
